#include "music_player.h"
#include "ui_music_player.h"

#include <QFileDialog>
#include <QFileInfo>
#include <QMessageBox>
#include <QSettings>

music_player::music_player(QWidget *parent) :
    QWidget(parent),
    ui(new Ui::music_player)
{
    ui->setupUi(this);
    this->setWindowTitle("音乐播放器");



    //制作音乐播放器
    //QT += multimedia 多媒体音频 -> 播放音乐、声音
    //QT += multimediawidgets  多媒体视频 ->播放视频、摄像头录像
    //我们需要用到的类 -> QMediaPlayer 与 QMediaPlaylist
    //首先完成本地音乐播放 -> 在线音乐播放器

    this->player = new QMediaPlayer(this);
    this->playlist = new QMediaPlaylist(this);

    //将音乐播放列表设置给音乐播放家
    this->player->setPlaylist(playlist);

    //初始化控件
    //设置 播放模式为列表循环
    this->playlist->setPlaybackMode(QMediaPlaylist::Loop);
    //设置音量默认为50
    this->player->setVolume(50);
    ui->music_volum->setValue(50);


    // 加载上次保存的歌曲名和整个播放列表
    QSettings settings("YourOrganization", "YourAppName");
//            settings.remove("playlist");
    musiclist = settings.value("playlist").toStringList();
    qDebug()<<settings.value("playlist").toStringList();
    if(!musiclist.isEmpty())
    {
        int count = musiclist.count();
        for (int i = 0;i<count;i++) {
            QString list = musiclist[i];
            ui->music_list->addItem(list);
            qDebug()<<list;
        }
    }
    QSettings settings_2("Mymedia","media");
//            settings.remove("Media_list");
    if(settings_2.contains("Media_list"))
    {
    medialist = settings_2.value("Media_list").toStringList();
    if(!medialist.isEmpty())
     {
        int count = medialist.count();
        for (int i = 0;i<count;i++) {
            QString url = medialist[i];
            playlist->addMedia(QMediaContent(QUrl(url)));
            qDebug()<<"链接"<< url;
        }
     }
    }

    //添加本地音乐 到播放列表
    //        this->playlist->addMedia(QMediaContent(QUrl("qrc:/new/prefix2/sound/小苹果.mp4")));//添加资源文件
    //        //注意：如果添加的为本地音乐。我们是可以通过 duration 获取音乐时长。
    //        //如果添加的是资源文件，会将文件解码，如果文件没有加密处理，我们是无法获取时长的
    //        this->playlist->addMedia(QMediaContent(QUrl("qrc:/new/prefix2/sound/爱如火.mp3")));//添加资源文件
    //        this->playlist->addMedia(QMediaContent(QUrl::fromLocalFile("G:\\蓝莲花.mp3")));//添加本地文件

    //将音乐的名字 添加到 ui 的listWidget 里面
    //        ui->music_list->addItem("小苹果.mp4");
    //        ui->music_list->addItem("爱如火.mp3");
    //        ui->music_list->addItem("蓝莲花.mp3");
    //播放按钮
    connect(ui->btn_play,&QPushButton::clicked,this,[=](){
        //获取 现在选择的歌曲 与 现在正在播放的歌曲
        int select = ui->music_list->currentRow();//选中的歌曲
        int playing = this->playlist->currentIndex();//正在播放的歌曲

        if(select != playing)
        {
            this->playlist->setCurrentIndex(select);//当正在播放的，与选中的不是同一个是，播放选中的
        }

        if(ui->btn_play->text() == "播放")
        {
            ui->btn_play->setText("暂停");
            this->player->play();
        }
        else
        {
            this->player->pause();
            ui->btn_play->setText("播放");
        }
    });

    connect(ui->btn_pre,&QPushButton::clicked,this->playlist,&QMediaPlaylist::previous);//上一首
    connect(ui->btn_next,&QPushButton::clicked,this->playlist,&QMediaPlaylist::next);//下一首

    //默认播放第一首
    if(ui->music_list->count() > 0)
    {
        ui->music_list->setCurrentRow(0);
    }

    //播放链表 播放的歌曲改变的时候，ui 显示也会随之更改
    connect(this->playlist,&QMediaPlaylist::currentIndexChanged,this,[=](int ipos){
        ui->music_list->setCurrentRow(ipos);
    });

    //双击 音乐就播放音乐
    connect(ui->music_list,&QListWidget::doubleClicked,this,[=](){
        //获取 现在选择的歌曲 与 现在正在播放的歌曲
        int select = ui->music_list->currentRow();//选中的歌曲
        int playing = this->playlist->currentIndex();//正在播放的歌曲

        if(select != playing)
        {
            this->playlist->setCurrentIndex(select);//当正在播放的，与选中的不是同一个是，播放选中的
            this->player->play();
            ui->btn_play->setText("暂停");
        }
        else
        {
            this->player->pause();
            ui->btn_play->setText("播放");
        }
    });

    //播放模式和音量设置
    connect(ui->play_model,&QComboBox::currentTextChanged,this,[=](const QString &text){
        if(text == "列表循环")
        {
            this->playlist->setPlaybackMode(QMediaPlaylist::Loop);
        }
        else if(text == "顺序播放")
        {
            this->playlist->setPlaybackMode(QMediaPlaylist::Sequential);
        }
        else if(text == "单曲循环")
        {
            this->playlist->setPlaybackMode(QMediaPlaylist::CurrentItemInLoop);
        }
        else if(text == "随机播放")
        {
            this->playlist->setPlaybackMode(QMediaPlaylist::Random);
        }
    });

    connect(ui->music_volum,&QSlider::valueChanged,this->player,&QMediaPlayer::setVolume);


    //添加和删除按钮
    connect(ui->btn_add,&QPushButton::clicked,this,[=](){
        QStringList data = QFileDialog::getOpenFileNames(this,"添加音乐","G:\\","*.mp3 *.mp4 *.wav");

        //将音乐添加到音乐播放链表，同时同步到 ui 显示链表
        for(int i = 0;i < data.size();i++)
        {
            this->playlist->addMedia(QMediaContent(QUrl::fromLocalFile(data[i])));

            //将名字同步到 ui 显示界面
            QFileInfo info(data[i]);//获取文件名字  -> 文件名就是音乐名
            ui->music_list->addItem(info.fileName());
        }
    });

    connect(ui->btn_delete,&QPushButton::clicked,this,[=](){
        //删除指定音乐
        int select = ui->music_list->currentRow();
        if(this->playlist->removeMedia(select))//播放列表音乐删除成功
        {
            // 删除 ui 显示界面的音乐
            ui->music_list->takeItem(select);
            return;
        }
        QMessageBox::information(this,"删除音乐","删除失败");
    });

    //本地音乐的最后一步 播放本地的mp4 视频
    this->player->setVideoOutput(ui->widget);//设置 视频的输出源

    this->http = new QNetworkAccessManager(this);//实例化

    connect(ui->btn_search,&QPushButton::clicked,this,&music_player::send_request);//搜索按钮

    connect(this->http,&QNetworkAccessManager::finished,this,&music_player::handle_request);

    //进度条改变
    //显示音乐时长，进度条跟着走
    connect(player,&QMediaPlayer::positionChanged,this,&music_player::position_change);
    //进度条改变音乐跟着改
    connect(ui->music_progress, &QSlider::sliderReleased, this, &music_player::seek_change);

}

music_player::~music_player()
{
    delete ui;
}

void music_player::send_request()
{
    //发送请求 需要去找接口
    //网址
    //http://music.163.com/api/search/get/web?csrf_token=hlpretag=&hlposttag=&s= + 音乐名 + &type=1&offset=0&total=true&limit=2
    //请求方式 get
    QString url = "http://music.163.com/api/search/get/web?csrf_token=hlpretag=&hlposttag=&s=" + ui->line_search->text() + "&type=1&offset=0&total=true&limit=2";
    this->http->get(QNetworkRequest(QUrl(url)));//发送请求
}

void music_player::handle_request(QNetworkReply *reply)
{
    //先看状态码
    int statu = reply->attribute(QNetworkRequest::HttpStatusCodeAttribute).toInt();
    if(statu != 200)
    {
        QMessageBox::critical(this,"网络错误","找不到信息");
        return;
    }

    //数据解析
    QByteArray data = reply->readAll();
    QJsonDocument doc = QJsonDocument::fromJson(data);

    if(doc.isObject())
    {
        QJsonObject obj = doc.object();
        QJsonObject obj_result = obj["result"].toObject();
        QJsonArray obj_songs = obj_result["songs"].toArray();

        //默认 添加搜索到的第一首歌 放入到音乐链表
        QJsonObject obj_music = obj_songs[0].toObject();
        //网上搜索到的信息
        //音乐播放的地址为 "http://music.163.com/song/media/outer/url?id=" + 音乐id + ".mp3";
        int music_id = obj_music["id"].toInt();
        qDebug()<<"music id:"<<music_id;
        QString url = "http://music.163.com/song/media/outer/url?id=" + QString::number(music_id)+ ".mp3";
        this->playlist->addMedia(QMediaContent(QUrl(url)));//将音乐添加到了 音乐播放列表
        ui->music_list->addItem(obj_music["name"].toString() + ".mp3");
        qDebug()<<"zhaomo"<<url;

    }
}

//过滤分发器，关闭时保存播放列表
void music_player::closeEvent(QCloseEvent *event)
{
    // 停止音乐播放
    if (player->state() == QMediaPlayer::PlayingState)
        player->stop();

    musiclist.clear();
    medialist.clear();
    // 保存当前播放的歌曲索引和整个播放列表
    if(ui->music_list->count())
    {
        for (int i = 0; i < ui->music_list->count(); i++) {
            QString list = ui->music_list->item(i)->text();
            musiclist.append(list);
            qDebug()<<"音乐列表" <<list;
        }
    }
    if(playlist->mediaCount())
    {
        for (int i = 0; i < playlist->mediaCount(); i++) {
            QMediaContent music_url = playlist->media(1);
            medialist.append(music_url.canonicalUrl().toString());
            qDebug() <<"音乐链接"<< music_url.canonicalUrl().toString() ;
        }
    }


    QSettings settings("YourOrganization", "YourAppName");
    settings.setValue("playlist", musiclist);

    QSettings settings_2("Mymedia","media");
    settings_2.setValue("Media_list", medialist);

    // 调用父类的 closeEvent
    QWidget::closeEvent(event);
}

//显示音乐时长，进度条跟着走
void music_player::position_change(qint64 position)
{
    qDebug()<<position;
    ui->music_progress->setMaximum(player->duration()/1000);//设置滑块的长度范围为音乐长.00度
    ui->music_progress->setValue(position/1000);//如果音乐进度改变，则改变滑块显示位置
    moved = position;//让播放时间等于音乐进度（毫秒）
    QTime moveTime(0,(moved/60000) % 60,(moved/1000)%60);//设置时间
    ui->currenttime->setText(moveTime.toString("mm:ss"));//显示当前时间

    int total = player->duration();
    QTime time_total(0,(total/60000) % 60,(total/1000)%60);//设置总时间
    ui->total_time->setText(time_total.toString());//显示总时间

}

//进度条改变音乐跟着改
void music_player::seek_change()
{

    int slider_value = ui->music_progress->value();
    player->setPosition(slider_value*1000);
}
